package com.Practice;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class Practice01 {
    //实现线程池
    public static void main(String[] args) {
        ExecutorService service = new ThreadPoolExecutor(
               3,//核心线程数
               5,//最大线程数
               3000,//临时线程存活的时间
               TimeUnit.MILLISECONDS,//时间单位
                new ArrayBlockingQueue<>(5),//任务队列
                Executors.defaultThreadFactory(),
                // DiscardPolicy 放弃新的任务 / CallerRunsPolicy 由调用者所在的线程去执行
                // DiscardOldestPolicy 抛弃掉最前面的任务 / AbortPolicy 抛出异常
                new ThreadPoolExecutor.CallerRunsPolicy() // 任务饱和的时候的处理策略
        );
        for (int i = 0; i < 10; i++) {
            int sum = i;
            // 先把前三个核心线程执行 剩下的七个放到任务队列 --> 5个放到任务队列 剩下2个 在创建两个临时线程
            service.execute(() ->{
                System.out.println(Thread.currentThread().getName() + "执行任务" + sum);
            });
        }
        service.shutdown();
    }
}
class MyThreadFactory implements ThreadFactory{
    AtomicInteger integer = new AtomicInteger(1);
    @Override
    public Thread newThread(Runnable r) {
        return new Thread(r,"线程" + integer.getAndIncrement());
    }
}